package com.wskj.common.core.domain.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.wskj.common.annotation.Excel;
import com.wskj.common.annotation.Excels;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 用户对象 sys_user
 *
 * @author ruoyi
 */

@Data
@NoArgsConstructor
@Accessors(chain = true)
@TableName("sys_user")
public class SysUser implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 用户ID
     */
    @Excel(name = "用户序号", cellType = Excel.ColumnType.NUMERIC, prompt = "用户编号")
    @TableId(value = "user_id", type = IdType.AUTO)
    private Long userId;

    /**
     * 部门ID
     */
    @Excel(name = "部门编号", type = Excel.Type.IMPORT)
    private Long deptId;

    /**
     * 用户账号
     */
    @NotBlank(message = "用户账号不能为空")
    @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
    @Excel(name = "登录名称")
    private String userName;

    /**
     * 用户昵称
     */
    @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
    @Excel(name = "用户名称")
    private String nickName;

    /**
     * 用户类型
     */
    @Size(min = 0, max = 30, message = "用户类型（00系统用户 01 主播  02 团长  03 分公司）")
    private String userType;


    /**
     * 真实姓名
     */
    @Size(min = 0, max = 255, message = "真实姓名")
    private String realName;


    /**
     * 用户邮箱
     */
    @Email(message = "邮箱格式不正确")
    @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
    @Excel(name = "用户邮箱")
    private String email;

    /**
     * 手机号码
     */
    @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符")
    @Excel(name = "手机号码")
    private String phoneNumber;

    /**
     * 用户性别
     */
    @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知")
    private String sex;

    /**
     * 用户头像
     */
    private String avatar;

    /**
     * 密码
     */
    private String password;

    /**
     * 帐号状态（0正常 1停用）
     */
    @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用 2注销")
    private String status;
    /**
     * 最后登录IP
     */
    @Excel(name = "最后登录IP", type = Excel.Type.EXPORT)
    private String loginIp;
    /**
     * 最后登录时间
     */
    @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Excel.Type.EXPORT)
    private Date loginDate;
    /**
     * 备注
     */
    @ApiModelProperty("备注")
    private String remark;

    /**
     * 微信唯一标识
     */
    @ApiModelProperty(value = "微信唯一标识")
    private String wxUid;
    /**
     * QQ唯一标识
     */
    @ApiModelProperty(value = "QQ唯一标识")
    private String qqUid;
    /**
     * 支付宝唯一标识
     */
    @ApiModelProperty(value = "支付宝唯一标识")
    private String alipayUid;
    /**
     * 苹果唯一标识
     */
    @ApiModelProperty(value = "苹果唯一标识")
    private String iphoneUid;
    /**
     * 在线状态 0：在线 1：离线
     */
    @ApiModelProperty(value = "在线状态 0：在线 1：离线")
    private String onlineStatus;
    /**
     * 离线时间
     */
    @ApiModelProperty(value = "离线时间")
    private Date offlineTime;
    /**
     * 支付密码
     */
    @ApiModelProperty(value = "支付密码")
    private String payPassword;
    /**
     * 积分
     */
    @ApiModelProperty(value = "积分")
    private BigDecimal integral;
    /**
     * 余额(元)
     */
    @ApiModelProperty(value = "余额(元)")
    private BigDecimal balance;

    /**
     * 直属用户ID
     */
    @ApiModelProperty(value = "直属用户ID")
    private Long zhiUserId;

    /**
     * 微信收款码
     */
    @ApiModelProperty(value = "微信收款码")
    private String wxPayment;

    /**
     * 微信绑定姓名
     */
    @ApiModelProperty(value = "微信绑定姓名")
    private String wxName;

    /**
     * 支付宝收款码
     */
    @ApiModelProperty(value = "支付宝收款码")
    private String aliPayment;

    /**
     * 支付宝绑定姓名
     */
    @ApiModelProperty(value = "支付宝绑定姓名")
    private String aliName;

    /**
     * 会员状态 0：非会员 1：会员
     */
    @ApiModelProperty(value = "会员状态 0：非会员 1：会员")
    private Integer vipStatus;

    /**
     * 会员到期时间
     */
    @ApiModelProperty(value = "会员到期时间")
    private Date dueDate;

    /**
     * 推荐码
     */
    @ApiModelProperty(value = "推荐码")
    private String recommendCode;


    /**
     * 身份证号
     */
    @ApiModelProperty(value = "身份证号")
    private String cardNo;


    /**
     * 邀请码(6位随机数）
     */
    @ApiModelProperty("邀请码(6位随机数）")
    private String inviteCode;

    /**
     * 邀请码全路径（包含父级和自己）
     */
    @ApiModelProperty("邀请码全路径（包含父级和自己）")
    private String inviteFullCode;


    /**
     * 总金额
     */
    @ApiModelProperty("总金额")
    private BigDecimal totalAmount;


    /**
     * 抖音收益
     */
    @ApiModelProperty("抖音收益")
    private BigDecimal tiktokAmount;


    /**
     * 推广收益
     */
    @ApiModelProperty("推广收益")
    private BigDecimal promoAmount;


    /**
     * 创建者
     */
    @TableField(fill = FieldFill.INSERT)
    private String createBy;
    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    /**
     * 更新者
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateBy;

    /**
     * 更新时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;

    /**
     * 是否已删除 0未删除 1已删除
     */
    @TableLogic
    private Integer deleted;


    /**
     * 小程序码路径
     */
    @ApiModelProperty("小程序码路径")
    private String miniPath;


    /**
     * 认证状态(1 已认证  2 认证不通过 3 认证中  4 不再审核)
     */
    @ApiModelProperty("认证状态(1 已认证  2 认证不通过  3  认证中 4 不再审核)")
    private String authStatus;


    /**
     * 是否有贡献股分红名额 1否 2是
     */
    @ApiModelProperty("是否有贡献股分红名额  1 否 2是")
    private String contributeQuota;


    /**
     * 请求参数
     */
    @TableField(exist = false)
    private Map<String, Object> params = new HashMap<>();

    /**
     * 盐加密
     */
    @TableField(exist = false)
    private String salt;

    /**
     * 部门对象
     */
    @Excels({
            @Excel(name = "部门名称", targetAttr = "deptName", type = Excel.Type.EXPORT),
            @Excel(name = "部门负责人", targetAttr = "leader", type = Excel.Type.EXPORT)
    })
    @TableField(exist = false)
    private SysDept dept;

    /**
     * 角色对象
     */
    @TableField(exist = false)
    private List<SysRole> roles;

    /**
     * 角色组
     */
    @TableField(exist = false)
    private Long[] roleIds;

    /**
     * 岗位组
     */
    @TableField(exist = false)
    private Long[] postIds;

    /**
     * 角色ID
     */
    @TableField(exist = false)
    private Long roleId;


    /**
     * 抖音号列表
     */
    @TableField(exist = false)
    private List<TbUserTiktok> detailList;


    /**
     * 直播收益
     */
    @TableField(exist = false)
    private BigDecimal livePrice;


    /**
     * 短视频收益
     */
    @TableField(exist = false)
    private BigDecimal videoPrice;


    /**
     * 直接上级信息
     */
    @TableField(exist = false)
    private SysUser parentUser;


    /**
     * 直接推荐人数
     */
    @TableField(exist = false)
    private Long directRecommend;


    /**
     * 间接推荐人数
     */
    @TableField(exist = false)
    private Long indirectRecommend;


    /**
     * 直接推荐佣金
     */
    @TableField(exist = false)
    private BigDecimal directRecommendPrice;


    /**
     * 直接推荐直播佣金
     */
    @TableField(exist = false)
    private BigDecimal directRecommendZhiboPrice;


    /**
     * 直接推荐短视频佣金
     */
    @TableField(exist = false)
    private BigDecimal directRecommendDuanshipinPrice;


    /**
     * 直接推荐主播佣金
     */
    @TableField(exist = false)
    private BigDecimal directRecommendZhuboPrice;


    /**
     * 直接推荐团长佣金
     */
    @TableField(exist = false)
    private BigDecimal directRecommendTuanzhangPrice;


    /**
     * 直接推荐分公司佣金
     */
    @TableField(exist = false)
    private BigDecimal directRecommendFengongsiPrice;


    /**
     * 间接推荐佣金
     */
    @TableField(exist = false)
    private BigDecimal indirectRecommendPrice;


    /**
     * 间接推荐直播佣金
     */
    @TableField(exist = false)
    private BigDecimal indirectRecommendZhiboPrice;


    /**
     * 间接推荐短视频佣金
     */
    @TableField(exist = false)
    private BigDecimal indirectRecommendDuanshipinPrice;


    /**
     * 间接推荐主播佣金
     */
    @TableField(exist = false)
    private BigDecimal indirectRecommendZhuboPrice;


    /**
     * 间接推荐团长佣金
     */
    @TableField(exist = false)
    private BigDecimal indirectRecommendTuanzhangPrice;


    /**
     * 间接推荐分公司佣金
     */
    @TableField(exist = false)
    private BigDecimal indirectRecommendFengongsiPrice;


    /**
     * 直推佣金+间推佣金+平台赠送+股权分红
     */
    @TableField(exist = false)
    private BigDecimal directAndIndirectRecommendPrice;


    /**
     * 直推佣金+间推佣金+平台赠送+股权分红-提现金额
     */
    @TableField(exist = false)
    private BigDecimal directAndIndirectRecommendTixianPrice;


    /**
     * 平台赠送
     */
    @TableField(exist = false)
    private BigDecimal platformGift;


    /**
     * 股权分红
     */
    @TableField(exist = false)
    private BigDecimal equityGift;


    /**
     * 提现金额
     */
    @TableField(exist = false)
    private BigDecimal withdrawalPrice;


    public SysUser(Long userId) {
        this.userId = userId;
    }

    public static boolean isAdmin(Long userId) {
        return userId != null && 1L == userId;
    }

    @JsonIgnore
    @JsonProperty
    public String getPassword() {
        return password;
    }

    public boolean isAdmin() {
        return isAdmin(this.userId);
    }

    /**
     * 推荐类型(1 直推  2间推)
     */
    @TableField(exist = false)
    private String recommendType;


    /**
     * 抖音uid
     */
    @TableField(exist = false)
    private String tikUid;

    /**
     * 用户ids
     */
    @TableField(exist = false)
    private List<Long> userIds;

}
